#include "adc.h"
#include <avr/io.h>
#include <avr/interrupt.h>


static unsigned char adc_channels[8];

void adc_init()
{	
	//Configuration of ADC
	//Resolution of 8 bits (ADLAR, left Adjust), AVCC reference.	
	ADMUX |= (1<<REFS0) | (1<<ADLAR);
	//Enable ADC, Start conversion, Auto trigger enable, Interrupt enable.
	ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
	//Disable digital input from all ADC channels. This will reduce consumption power.
	DIDR0 = 0xFF; //|= (1<<ADC0D);

}


void adc_setChannel(unsigned char channel)
{
	channel &= 0x07;
	ADMUX = (1<<REFS0) | (1<<ADLAR) | channel;
}

unsigned char adc_getChannel()
{
	unsigned char channel;
	
	channel = ADMUX & 0x07;
	
	return channel;
}

unsigned char adc_read(unsigned char channel)
{
	return adc_channels[channel];
}

//TODO: Lo mejor es pasar todo el codigo de transformacion a la lectura de bateria al codigo de sensors.c. Esta libreria debe dejarse
// exclusivamente para lecturas del ADC. Ademas, lo mejor sera que en la interrupcion se cambie al siguiente canal analogico, de tal
//manera que se logre una actualizacion a la frecuencia que muestrea el ADC.
ISR(ADC_vect)
{
	unsigned char channel = 0;
	
	//define que canal del ADC se esta leyendo
	channel = ADMUX & 0x07;	
	//almacena el respectivo valor en la variable requerida
	adc_channels[channel] = ADCH;

}
